package com.ninth;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 动态代理类
class ProxyFactoryBean implements InvocationHandler {
    private Object target;   //要代理的类
    private Advice advice;   //切面类；那是因为之前学习的动态代理的代码，是把切面类的代码写到了invoke里面，这里无非就是拿出来做单独一个接口实现类

    public Object getTarget() {
        return target;
    }

    public void setTarget(Object target) {
        this.target = target;
    }

    public Advice getAdvice() {
        return advice;
    }

    public void setAdvice(Advice advice) {
        this.advice = advice;
    }

    //动态的获取代理对象
    public Object getProxy() {
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);//这里返回的proxy其实是和target相同的类型

    }


    //invoke() 才是真正执行核心业务的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        advice.addBefore();                       //这里就呼应：private Advice advice;  之前学习的动态代理代码，这里是具体的代码，现在换成方法调用的形式而已
        Object obj = method.invoke(target, args); //核心业务方法
        advice.addEnd();                          //这里就呼应：private Advice advice;
        return obj;
    }
}